import ast
from typing import List, Optional

from 程序核心代码.mvvm重构.基础定义.基础图形项.基础图形组件.节点基础图形项 import 带布局的节点基础图形项

from 程序核心代码.ast节点.节点定义.基础定义.ast节点基础定义 import ast节点基础模型


class 简单语句ast节点基础模型(ast节点基础模型):
    """
    表示无子节点的简单语句节点，如 Break、Continue、Pass 等。
    """

    def 节点数据解析(self):
        pass

    def __init__(self, ast节点, 所属节点模型管理器, 上级节点: Optional['ast节点基础模型'] = None,
                 节点位置: Optional[List] = None):

        super().__init__(ast节点, 所属节点模型管理器, self.获取属性("节点名称"), 节点类型="简单语句", 上级节点=上级节点,
                         节点位置=节点位置)
        self.节点标题名称=self.获取属性("节点名称")
        #print(f"创建{起始接口.获取属性("节点名称")}节点模型")
        #print("节点标题名称",起始接口.节点标题名称)
        if self.节点介绍:
            self.节点介绍 = f"简单语句节点，{self.获取属性("节点名称")}"
        self.是控制节点 = True
        self.图形项 = 简单语句图形项(self)



    def 获取参数(self):
        """
        简单语句节点通常不包含参数，返回 None。
        """
        return None

    def 设置参数(self, 参数):
        """
        简单语句节点通常不需要设置参数，不执行任何操作。
        """
        pass

    def 创建独立节点(self):
        """
        根据具体的 AST 类型创建相应的节点实例。
        """
        if self.节点ast类型 == ast.Break:
            _节点 = ast.Break()
        elif self.节点ast类型 == ast.Continue:
            _节点 = ast.Continue()
        elif self.节点ast类型 == ast.Pass:
            _节点 = ast.Pass()
        elif self.节点ast类型 == ast.Return:
            _节点 = ast.Return(value=None)
        elif self.节点ast类型 == ast.Raise:
            _节点 = ast.Raise(exc=None, cause=None)
        elif self.节点ast类型 == ast.Global:
            _节点 = ast.Global(names=[""])
        elif self.节点ast类型 == ast.Nonlocal:
            _节点 = ast.Nonlocal(names=[""])
        else:
            raise NotImplementedError(f"不支持的节点类型: {self.节点ast类型}")

        # 插入节点到 AST 结构中
        位置 = self.所属节点模型管理器.ast操作器.插入节点(self.节点路径, _节点)
        self.节点路径 = self.节点路径 + [位置]
        print(f"{self.获取属性("节点名称")}创建成功")
        print(self.节点路径)
        print(ast.dump(self.所属节点模型管理器.ast结构树, annotate_fields=True, indent=4))


class 简单语句图形项(带布局的节点基础图形项):
    def __init__(self, 节点定义, 父项=None):
        super().__init__(节点定义, 父项)
        # 起始接口.介绍文本.setPlainText(f"{节点定义.节点介绍}")
        # 起始接口.节点定义.节点介绍 = 起始接口.节点定义.节点名称 + "：默认介绍"

